Skip to content

什么是 Docker

1、什么是 Docker

理解虚拟化技术

人们为了提高系统及硬件资源的利用率而引入了虚拟化技术。虚拟化是一种资源管理技术,它可以各种实体资源抽像后再分隔,从而打破实体结构的限制,最大程度的提高资源的利用率。

虚拟化的目的是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理和容错容灾等好处。

从实现形式来分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。

基于软件的虚拟化

软件虚拟化是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。

对软件虚拟化进行细分,又可以分为以下几类:

  • 完全虚拟化
  • 硬件辅助虚拟化
  • 部分虚拟化
  • 平行虚拟化
  • 操作系统层虚拟化

Docker容器技术就是属于操作系统层虚拟化的范畴。

虚拟化是通过软件的方式模拟实体服务器,其初衷是为了解决“一种应用占用一台服务器”模式所带来的服务器数量剧增的问题,从而降低数据中心复杂度,简化管理难度。

虚拟机和Docker

容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源。

虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

虚拟机和 Docker 的对比 image.png

图解物理机,虚拟机与容器

物理机

image.png

虚拟机

image.png 容器

image.png

虚拟机和Docker容器各自有自己的应用场景,虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。

而 Docker 通常用于隔离不同的应用 ,例如前端,后端以及数据库。

2、Docker 基本概念

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker Registry 公开服务和私有 Docker Registry

Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:https://hub.docker.com/open in new window 。官方是这样介绍 Docker Hub 的:

Docker Hub 是 Docker 官方提供的一项服务,用于与您的团队查找和共享容器镜像。

比如我们想要搜索自己想要的镜像:

image.png

在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:

  • OFFICIAL Image:代表镜像为 Docker 官方提供和维护,相对来说稳定性和安全性较高。
  • Stars:和点赞差不多的意思,类似 GitHub 的 Star。
  • Downloads:代表镜像被拉取的次数,基本上能够表示镜像被使用的频度。

除了直接通过 Docker Hub 网站搜索镜像这种方式外,我们还可以通过 docker search 这个命令搜索 Docker Hub 中的镜像,搜索的结果是一致的。

➜  ~ docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   8763                [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3073                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   650                                     [OK]

在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 阿里云镜像库

除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry

Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

3、基本命令

基本命令

docker version # 查看docker版本
docker images # 查看所有已下载镜像,等价于:docker image ls 命令
docker container ls # 查看所有容器
docker ps #查看正在运行的容器
docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;

拉取镜像

docker search mysql # 查看mysql相关镜像
docker pull mysql:5.7 # 拉取mysql镜像
docker image ls # 查看所有已下载镜像

删除镜像

比如我们要删除我们下载的 mysql 镜像。

通过 docker rmi [image] (等价于docker image rm [image])删除镜像之前首先要确保这个镜像没有被容器引用(可以通过标签名称或者镜像 ID 删除)。

通过我们前面讲的docker ps命令即可查看。

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
c4cd691d9f80        mysql:5.7           "docker-entrypoint.s…"   7 weeks ago         Up 12 days          0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

可以看到 mysql 正在被 id 为 c4cd691d9f80 的容器引用,我们需要首先通过 docker stop c4cd691d9f80 或者 docker stop mysql暂停这个容器。

然后查看 mysql 镜像的 id

➜  ~ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mysql                   5.7                 f6509bac4980        3 months ago        373MB

通过 IMAGE ID 或者 REPOSITORY 名字即可删除

docker rmi f6509bac4980 #  或者 docker rmi mysql

4、Build Ship and Run

搜索 Docker 官网,会发现如下的字样:“Docker - Build, Ship, and Run Any App, Anywhere”

  • Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。
  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样。
  • Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。

Docker 运行过程是会去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。

Docker 也被称为码头工人或码头装卸工,这和 Docker 的中文翻译搬运工人如出一辙。

image.png


参考